package cn.coco.jf.fw.api.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import cn.coco.jf.fw.api.cache.SysCacheManager;
import cn.coco.jf.fw.api.config.JkapiJson;
import cn.coco.jf.fw.api.render.JkQrcodeRender;
import cn.exlu.coco.core.utils.StringUtil;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;

public class FwApiBaseController extends Controller {


	/**
	 * 参数必须项验证
	 * @param objs
	 * @return
	 */
    protected boolean checkRequired(String ... vals){
        for(String val : vals){
            if(StringUtil.isNullOrEmpty(val)){
                return false;
            }
        }
        return true;
    }

    /**
     * 正常
     * @param obj 结果数据
     */
    protected void success(Object data){
        setAttr("code", 200);
        setAttr("msg", "OK");
        setAttr("data", data);
        renderJson();
    }

    protected void err(int code){
        setAttr("code", code);
        setAttr("msg", "");
        renderJson();
    }
    
    protected void err(int code, String msg){
        setAttr("code", code);
        setAttr("msg", msg);
        renderJson();
    }
    
    protected void errOther(String msg){
        setAttr("code", 999);
        setAttr("msg", msg);
        renderJson();
    }

    /**
     * 参数缺失
     */
    protected void errRequired(){
        setAttr("code", 700);
        renderJson();
    }
    
    /**
     * wasu用
     * @param listName
     * @param page
     */
    protected <T extends Model> void pageJsonApiWasu(String listName, Page<T> page){
        setAttr("code", 200);
        setAttr("msg", "OK");

        JSONObject data = createData();
        // 总页数
        data.put("pageTotal", page.getTotalPage());
        // 页号
        data.put("pageNumber", page.getPageNumber());
        // 每页显示数
        data.put("pageSize", page.getPageSize());
        // 查询结果数
        data.put("rows", page.getList().size());
        // 查询总行数
        data.put("total", page.getTotalRow());

        data.put(listName, page.getList());

        int prePageNumber = 0;
        if(page.getPageNumber() == 1){
            prePageNumber = 0;
        }else{
            prePageNumber = page.getPageNumber() - 1;
        }

        int i = 1;
        for(T t: page.getList()){
            t.put("curNo", prePageNumber * page.getPageSize() + i++);
        }

        success(data);
    }

    /**
     * wasu用
     * @param listName
     * @param page
     * @param map
     */
    protected <T extends Model> void pageJsonApiWasuData(String listName, Page<T> page, Map<String,Object> map){
        setAttr("code", 200);
        setAttr("msg", "OK");

        JSONObject data = createData();
        // 总页数
        data.put("pageTotal", page.getTotalPage());
        // 页号
        data.put("pageNumber", page.getPageNumber());
        // 每页显示数
        data.put("pageSize", page.getPageSize());
        // 查询结果数
        data.put("rows", page.getList().size());
        // 查询总行数
        data.put("total", page.getTotalRow());

        data.put(listName, page.getList());

        data.putAll(map);


        int prePageNumber = 0;
        if(page.getPageNumber() == 1){
            prePageNumber = 0;
        }else{
            prePageNumber = page.getPageNumber() - 1;
        }

        int i = 1;
        for(T t: page.getList()){
           t.put("curNo", prePageNumber * page.getPageSize() + i++);
        }

        success(data);
    }
    
    protected <T> void pageJsonApi(String listName, Page<T> page){
        setAttr("code", 200);
        setAttr("msg", "OK");

        JSONObject data = createData();
        // 总页数
        data.put("pageTotal", page.getTotalPage());
        // 页号
        data.put("pageNumber", page.getPageNumber());
        // 每页显示数
        data.put("pageSize", page.getPageSize());
        // 查询结果数
        data.put("rows", page.getList().size());
        // 查询总行数
        data.put("total", page.getTotalRow());

        data.put(listName, page.getList());

        success(data);

    }

    protected <T> void pageJsonApiData(String listName, Page<T> page, Map<String,Object> map){
        setAttr("code", 200);
        setAttr("msg", "OK");

        JSONObject data = createData();
        // 总页数
        data.put("pageTotal", page.getTotalPage());
        // 页号
        data.put("pageNumber", page.getPageNumber());
        // 每页显示数
        data.put("pageSize", page.getPageSize());
        // 查询结果数
        data.put("rows", page.getList().size());
        // 查询总行数
        data.put("total", page.getTotalRow());
        data.put(listName, page.getList());

        data.putAll(map);

        success(data);

    }

    protected <T> void pageJson(Page<T> page){
        setAttr("code", 200);
        setAttr("msg", "OK");
        
        JSONObject data = createData();
        data.put("rows", page.getList());
        data.put("total", page.getTotalRow());

        success(data);
    }
    
    protected String toJsonString(Object value){
        return JkapiJson.toJsonStr(value);
    }
    
    public void renderQrcodeText(String content, String txt, Integer width, Integer height){
        if(width == null){
            width = 200;
        }
        if(height == null){
            height = 200;
        }
        this.render(new JkQrcodeRender(content, txt, width, height));
    }
    
    public JSONObject createData(){
        return new JSONObject();
    }
    
    public JSONObject createJson(){
        return new JSONObject();
    }
    
    public JSONArray createJsonArray(){
        return new JSONArray();
    }
    
    public JSONObject parseJSON(String val){
        return JSONObject.parseObject(val);
    }

    private List<String> parseArrs(String value){
        List<String> list = new ArrayList<String>();
        if(StringUtil.isNullOrEmpty(value)){
            return list;
        }

        String[] arrs = value.split(StringUtil.CHAR_COMMA);
        
        for(String arr : arrs){
            if(!StringUtil.isNullOrEmpty(arr)){
                list.add(arr);
            }
        }
        
        return list;
    }
    
    protected List<String> getParaValuesString(String name){
        return parseArrs(this.getPara(name));
    }
    
    /**
     * 获取参数：每页显示数量
     * @return
     */
    protected Integer getParaRows(){
        return getParaToInt("rows", 10);
    }
    /**
     * 获取参数：页号
     * @return
     */
    protected Integer getParaPage(){
        return getParaToInt("page", 1);
    }
    
    /**
     * 获取DB配置信息
     * @param propName
     * @return
     */
    protected String getPropValue(String propName){
        return SysCacheManager.getPropValue(propName);
    }
    
    /**
     * 获取DB配置信息
     * @param propName
     * @return
     */
    protected int getPropValueInt(String propName){
        return SysCacheManager.getPropValueInt(propName);
    }

    
//    /**
//     * 渲染二维码
//     * @param content 二维码中所包含的数据内容
//     * @param width 二维码宽度，单位为像素
//     * @param height 二维码高度，单位为像素
//     */
//    public void renderQrCode(String content, int width, int height) {
//        render = renderManager.getRenderFactory().getQrCodeRender(content, width, height);
//    }
//    

}
